<?php


namespace app\live\controller\v1;


use app\common\cachemodel\AppConfig;
use app\common\cachemodel\live\LiveAnchorInfo;
use app\common\lib\Alidayu;
use app\common\lib\exception\ApiException;
use app\common\lib\IAuth;
use app\live\controller\Common;
use think\Cache;
use think\Log;

class Login extends Common
{
    /**
     * 主播获取验证吗
     * @throws \Exception
     */
    public function getCode()
    {
        $tel = trim(input('tel/s', ''));

        $tel = $this->decryptWithOpenssl($tel);

        // 手机号是否存在
        if (!preg_match("/^1[3456789]{1}\d{9}$/", $tel))
        {
            Log::write('手机号错误：' . $tel, 'error', true);
            throw new ApiException('手机号错误', 200, 0);
        }

        $code = random_int(100000, 999999);// 六位验证码

        $alidayu = (new AppConfig())->configInfo('alidayu');

        $result = Alidayu::getInstance()->sendSms($tel, $code, $alidayu['login_code']);

        if (!$result)
        {
            return show(config('code.error'), '发送失败');
        }

        $key_of_tel_code_login_error_num = 'login_error_zhunle_live:' . $tel;
        Cache::rm($key_of_tel_code_login_error_num); // 登录

        return show(config('code.success'), '发送成功');
    }

    /**
     * 主播手机号登录
     */
    public function mobile()
    {
        $tel = trim(input('tel/s', ''));
        $code = trim(input('code/s', ''));

        $tel = $this->decryptWithOpenssl($tel);

        // 手机号是否存在
        if (!preg_match("/^1[3456789]{1}\d{9}$/", $tel))
        {
            Log::write('手机号错误：' . $tel, 'error', true);
            throw new ApiException('手机号错误', 200, 0);
        }

        // 短信验证码 或 密码是否存在
        if (empty($code))
        {
            return show(config('code.error'), '请输入验证码');
        }

        //防止暴力破解：手机号验证码登录失败10次后 除非重新获取验证码 否则验证码登录 验证码有效期（10分钟）内都自动错误
        $key_of_tel_code_login_error_num = 'login_error_zhunle_live:' . $tel;
        if (Cache::get($key_of_tel_code_login_error_num, 0) >= 10)
        {
            Log::write($tel . '主播手机号验证码登录失败超过10次，验证码失效', 'error');
            return show(config('code.error'), '短信验证码错误！');
        }

        if (mb_strlen($code) != 6)
        {
            Cache::inc($key_of_tel_code_login_error_num);
            return show(config('code.error'), '短信验证码错误！');
        }

        $appConfig = config('app');
        // 短信登录时，检测验证码是否正确
        if (!in_array($tel, $appConfig['mobile'], false) || (strpos($appConfig['code'] * (substr($tel, 3, 6)), $code) !== 0))
        {
            //  validate 严格校验
            $mobileCode = Alidayu::getInstance()->checkSmsIdentify($tel, 86); // 获取验证码
            if ($code != $mobileCode)
            {// 如果验证码错误
                Cache::inc($key_of_tel_code_login_error_num);
                return show(config('code.error'), '短信验证码错误！');
            }
        }

        $LiveModel = (new LiveAnchorInfo());
        $liveInfo = $LiveModel->where(['tel' => $tel])->field('id,live_id,token,tel,token_expire,status,name,avatar')->find();


        if ($liveInfo)
        {
            //状态 1=>正常 0=>禁止（禁止登陆） 2=>账号冻结（可以登录，但是不能接单
            if ($liveInfo['status'] === 0)
            {
                Log::write($tel . '主播手机号登录成功：该用户禁止登陆，请联系客服反馈问题～', 'error');
                return show(config('code.error'), '该用户禁止登陆，请联系客服反馈问题～');
            }
            try
            {
                // 生成token  和 token到期时间
                $token = IAuth::setAppLoginToken($tel);

                $data = [
                    'token' => $token,
                    'token_expire' => strtotime('+' . config('live_app.login_time_out_day') . ' day')
                ];

                $LiveModel->updateData($liveInfo['live_id'], $data);
            }
            catch (\Exception $e)
            {
                Log::write($tel . '主播手机号验证码登录失败：' . $e->getMessage() . '失败行数：' . $e->getLine(), 'error');
                return show(config('code.error'), '登录失败，请稍后再试～');
            }

            $data = [
                'access_token' => $this->encryptWithOpenssl($token . '||' . $liveInfo['live_id']),
            ];

            return show(config('code.success'), '登录成功', $data);
        }

        return show(config('code.error'), '当前主播不存在！');
    }

}
